// 版权所有2009 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

// Frexp将f分解为一个标准化分数
// 和一个2的整数幂。
// 返回满足f==frac×2**exp的frac和exp，
// frac的绝对值在[½，1]区间内。
// 
// 特殊情况为：
// Frexp（±0）=±0，0 
// Frexp（±Inf）=±Inf，0 
// Frexp（NaN）=NaN，0 
func Frexp(f float64) (frac float64, exp int) {
	if haveArchFrexp {
		return archFrexp(f)
	}
	return frexp(f)
}

func frexp(f float64) (frac float64, exp int) {
	// 特殊情况
	switch {
	case f == 0:
		return f, 0 // 正确返回-0 
	case IsInf(f, 0) || IsNaN(f):
		return f, 0
	}
	f, exp = normalize(f)
	x := Float64bits(f)
	exp += int((x>>shift)&mask) - bias + 1
	x &^= mask << shift
	x |= (-1 + bias) << shift
	frac = Float64frombits(x)
	return
}
